/*
 * PagFormularioEvento.java
 * 
 * Projeto: Kruskal - SRAC
 * LEDS - Laboratório de Engenharia e Desenvolvimento de Software
 * IFES - Instituto Federal do Espírito Santo - Campus Serra.
 */
package srac.controleeventos.cih;

import java.net.MalformedURLException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.xml.bind.JAXBException;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.Executions;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.util.GenericForwardComposer;
import org.zkoss.zul.*;
import srac.controleatividades.cci.CtrlAtividade;
import srac.controleatividades.cci.CtrlInterno;
import srac.controleatividades.cdp.TipoAtividade;
import srac.controleeventos.cci.CtrlEvento;
import srac.controleeventos.cdp.Evento;
import srac.controleeventos.cdp.TipoEvento;
import util.utilitarioEndereco.cdp.*;
import util.utilitarioEndereco.cgt.BuscaCep;
import util.utilitarioEndereco.cgt.webservicecep;
import util.utilitarioExceptions.SracException;

public class PagFormularioEvento extends GenericForwardComposer {

    private CtrlEvento ctrl = CtrlEvento.getInstance();
    private Evento obj;
    private Window winFormularioEventos;
    private Textbox nomeEvento, logradouro, complemento;
    private Combobox pais, estado, municipio, bairro, tipos;
    private Intbox vagas, numero, cep;
    private Datebox data;
    private Button salvarEvento;
    private int MODO;
    
    

    @Override
    public void doAfterCompose(Component comp) throws Exception {
        super.doAfterCompose(comp);     
        List<TipoEvento> t = ctrl.obterTipoEventos();
        tipos.setModel(new ListModelList(t, true)); //Popula a combobox
        tipos.setReadonly(true);
        List<Pais> paises = ctrl.obterPaises();
        ListModelList<Pais> list = new ListModelList<Pais>(paises, true);
        pais.setModel(list);

        //colocando brasil como pais padrão
        list.addToSelection(paises.get(32));
        //onSelect$pais(null);
        List<Estado> estados = ctrl.obterEstados(paises.get(32));
        ListModelList<Estado> listEstado = new ListModelList<Estado>(estados, true);
        estado.setModel(listEstado);
        listEstado.addToSelection(estados.get(7));
        
        
        List<Municipio> municipios = ctrl.obterMunicipio(estados.get(7));
        ListModelList<Municipio> listMunicipios = new ListModelList<Municipio>(municipios, true);
        municipio.setModel(listMunicipios);
        listMunicipios.addToSelection(municipios.get(239));
        
        List<Bairro> bairros = ctrl.obterBairro(municipios.get(239));
        ListModelList<Bairro> listBairros = new ListModelList<Bairro>(bairros, true);
        bairro.setModel(listBairros);
        listBairros.addToSelection(bairros.get(63));
        logradouro.setText("Rodovia ES-010");
        complemento.setText("Km 6,5");
        numero.setValue(0);
        cep.setText("29173087");
        
        pais.setReadonly(true);
        estado.setReadonly(true);
        municipio.setReadonly(true);
        bairro.setReadonly(true);
        
        if(MODO == CtrlAtividade.SALVAR) {
            String before = pegarDatas(new Date(System.currentTimeMillis()));
            data.setConstraint("after " + before); //Bloqueia as datas do calendaria anteriores ao dia atual
        }
    }

    private void preencherTela() throws Exception {
        Calendar c;
        tipos.setValue(obj.getTipo().toString());
        c = obj.getData();
        data.setValue(c.getTime());
        nomeEvento.setText(obj.getNome());
        complemento.setText(obj.getEndereco().getComplemento());
        vagas.setValue(obj.getVagas());
        cep.setText(obj.getEndereco().getCep().toString());
        logradouro.setText(obj.getEndereco().getLogradouro());
        preencherEndereco(obj.getEndereco());
        numero.setValue(obj.getEndereco().getNumero());

    }

    public void preencherEndereco(Endereco endereco) throws Exception {
        try {
            Pais p = endereco.getBairro().getMunicipio().getEstado().getPais();
            Estado e = endereco.getBairro().getMunicipio().getEstado();
            Municipio m = endereco.getBairro().getMunicipio();
            Bairro b = endereco.getBairro();

            List<Pais> paises = ctrl.obterPaises();
            List<Estado> estados = ctrl.obterEstados(p);
            List<Municipio> municipios = ctrl.obterMunicipio(e);
            List<Bairro> bairros = ctrl.obterBairro(m);

            if (p != null) {
                ((ListModelList) pais.getModel()).addToSelection(p);
                //onSelect$pais(null);
            }

            if (e != null) {
                ((ListModelList) estado.getModel()).addToSelection(e);
                //onSelect$estado(null);
            }

            if (m != null) {
                ((ListModelList) municipio.getModel()).addToSelection(m);
                //onSelect$municipio(null);
            }

            if (b != null) {
                ((ListModelList) bairro.getModel()).addToSelection(b);
            }
        } catch (SracException ex) {
            Logger.getLogger(PagFormularioEvento.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    private void bloquearTela() {
        tipos.setDisabled(true);
        nomeEvento.setDisabled(true);
        vagas.setDisabled(true);
        data.setDisabled(true);
        cep.setDisabled(true);
        logradouro.setDisabled(true);
        numero.setDisabled(true);
        complemento.setDisabled(true);
        pais.setDisabled(true);
        estado.setDisabled(true);
        municipio.setDisabled(true);
        bairro.setDisabled(true);

    }
    
    

    public void onClick$salvarEvento(Event event) {

        Evento e = null;
        Calendar c = Calendar.getInstance();
        String msg = valido();
        if (msg.trim().equals("")) {
            if (MODO == ctrl.EDITAR) {
                obj.setTipo((TipoEvento) tipos.getSelectedItem().getValue());              
                obj.setNome(nomeEvento.getText());
                obj.setVagas(vagas.getValue());
                c.setTime(data.getValue());
                obj.setData(c);
                obj.getEndereco().setCep(obterCEP(cep.getValue()));
                obj.getEndereco().setLogradouro(logradouro.getText());
                obj.getEndereco().setNumero(numero.getValue());
                obj.getEndereco().setComplemento(complemento.getText());
                obj.getEndereco().getBairro().getMunicipio().getEstado().setPais((Pais) pais.getSelectedItem().getValue());
                obj.getEndereco().getBairro().getMunicipio().setEstado((Estado) estado.getSelectedItem().getValue());
                obj.getEndereco().getBairro().setMunicipio((Municipio) municipio.getSelectedItem().getValue());
                obj.getEndereco().setBairro((Bairro) bairro.getSelectedItem().getValue());
                e = ctrl.alterarEvento(obj);
            } else {
                ArrayList<Object> list = new ArrayList<Object>();
                list.add((TipoEvento) tipos.getSelectedItem().getValue());
                list.add(nomeEvento.getText());
                list.add(vagas.getValue());
                c.setTime(data.getValue());
                list.add(c);
                list.add(obterCEP(cep.getValue()));
                list.add(logradouro.getText());
                list.add(numero.getValue());
                list.add(complemento.getText());
                list.add((Pais) pais.getSelectedItem().getValue());
                list.add((Estado) estado.getSelectedItem().getValue());
                list.add((Municipio) municipio.getSelectedItem().getValue());
                list.add((Bairro) bairro.getSelectedItem().getValue());

                e = ctrl.incluirEvento(list);

            }
            winFormularioEventos.onClose();
        } else {
            Messagebox.show(msg, "Informe:", 0, Messagebox.EXCLAMATION);
        }
    }

    public void onClick$voltar(Event event) {
        winFormularioEventos.onClose();
    }

    public void onCreate$winFormularioEventos() throws Exception {

//        if feito para verificar se existe algum usuario logado, se nao existir eh redirecionado para o login
        if (Executions.getCurrent().getSession().getAttribute("usuario") == null) {
            Executions.sendRedirect("/");
            winFormularioEventos.detach();
        }
        MODO = (Integer) arg.get("tipo");

        if (MODO == ctrl.CONSULTAR) {
            obj = (Evento) arg.get("obj");
            preencherTela();
            this.salvarEvento.setVisible(false);
            bloquearTela();
        } else if (MODO == ctrl.EDITAR) {

            obj = (Evento) arg.get("obj");
            preencherTela();

        }
    }

    public void onClick$buscarCep() {
        webservicecep web = null;
        try {
            web = BuscaCep.getEndereco(cep.getText());

        } catch (JAXBException ex) {
            Logger.getLogger(PagFormularioEvento.class.getName()).log(Level.SEVERE, null, ex);
        } catch (MalformedURLException ex) {
            Logger.getLogger(PagFormularioEvento.class.getName()).log(Level.SEVERE, null, ex);
        }
        if (web != null) {
            logradouro.setValue(web.getTipo_logradouro() + " " + web.getLogradouro());
            for (int i = 0; i < estado.getModel().getSize(); i++) {
                Estado e = (Estado) estado.getModel().getElementAt(i);
                if (e.getSigla().equals(web.getUf())) {
                    ((ListModelList) estado.getModel()).addToSelection(e);
                    onSelect$estado(null);
                }


            }
            //estado.setValue(web.getUf());
            if (municipio.getModel() != null) {
                for (int i = 0; i < municipio.getModel().getSize(); i++) {
                    Municipio m = (Municipio) municipio.getModel().getElementAt(i);
                    if (m.getNome().equals(web.getCidade())) {
                        ((ListModelList) municipio.getModel()).addToSelection(m);
                        onSelect$municipio(null);
                    }
                    //cidade.setValue(web.getCidade());

                }
                for (int i = 0; i < bairro.getModel().getSize(); i++) {
                    Bairro b = (Bairro) bairro.getModel().getElementAt(i);
                    if (b.getNome().equals(web.getBairro())) {
                        ((ListModelList) bairro.getModel()).addToSelection(b);
                    }
                }
            }
            complemento.setText("");
        }
    }

    public void onSelect$estado(Event event) {
        municipio.setSelectedItem(null);
        bairro.setSelectedItem(null);

        Object[] array = ((ListModelList) estado.getModel()).getSelection().toArray();
        Estado e;
        if (array.length > 0) {
            e = (Estado) array[0];
            List<Municipio> listMunicipio = ctrl.obterMunicipio(e);
            municipio.setModel(new ListModelList(listMunicipio, true));
        }
    }

    public void onSelect$municipio(Event event) {
        bairro.setSelectedItem(null);

        Object[] array = ((ListModelList) municipio.getModel()).getSelection().toArray();
        Municipio m;
        if (array.length > 0) {
            m = (Municipio) array[0];
            List<Bairro> listBairro = ctrl.obterBairro(m);
            bairro.setModel(new ListModelList(listBairro, true));
        }
    }

    public void onSelect$pais(Event event) {
        estado.setSelectedItem(null);
        municipio.setSelectedItem(null);
        bairro.setSelectedItem(null);

        Object[] array = ((ListModelList) pais.getModel()).getSelection().toArray();
        Pais p;
        if (array.length > 0) {
            p = (Pais) array[0];
            List<Estado> listEstados = ctrl.obterEstados(p);
            estado.setModel(new ListModelList(listEstados, true));
        }
    }

    public void limparCampos() {
        tipos.setSelectedItem(null);
        nomeEvento.setText("");
        logradouro.setText("");
        data.setValue(null);
        complemento.setText("");
        pais.setSelectedItem(null);
        estado.setSelectedItem(null);
        municipio.setSelectedItem(null);
        bairro.setSelectedItem(null);
        vagas.setValue(null);
        cep.setText("");
        numero.setText(null);
    }

    private String valido() {
        String msg = "";
        if (tipos.getSelectedItem() == null) {
            msg += "- Tipo\n";
        }
        if (nomeEvento.getText().trim().equals("")) {
            msg += "- Nome do Evento\n";
        }
        if (data.getValue() == null) {
            msg += "- Data de Realização\n";
        }
        if (pais.getSelectedItem() == null) {
            msg += "- País\n";
        }
        if (estado.getSelectedItem() == null) {
            msg += "- Estado\n";
        }
        if (municipio.getSelectedItem() == null) {
            msg += "- Municipio\n";
        }
        if (bairro.getSelectedItem() == null) {
            msg += "- Bairro\n";
        }
        if (cep.getText().trim().equals("")) {
            msg += "- CEP\n";
        }
        if (logradouro.getText().trim().equals("")) {
            msg += "- Logradouro\n";
        }
        if (numero.getText().trim().equals("")) {
            msg += "- Numero\n";
        }
        if (vagas.getText().trim().equals("")) {
            msg += "- Vagas\n";
        }

        return msg;
    }

    public Long obterCEP(Integer scep) {
        Long cep = new Long(scep);

        return cep;
    }

    public void obterEndereco(ArrayList<Object> listaEndereco) {
        listaEndereco.add(logradouro.getText());
        listaEndereco.add(obterCEP(cep.getValue()));
        listaEndereco.add(Integer.parseInt(numero.getText()));
        listaEndereco.add(complemento.getText());
        listaEndereco.add((Bairro) bairro.getSelectedItem().getValue());
        listaEndereco.add((Municipio) municipio.getSelectedItem().getValue());
        listaEndereco.add((Estado) estado.getSelectedItem().getValue());
        listaEndereco.add((Pais) pais.getSelectedItem().getValue());
    }
    
    public String pegarDatas(Date data) { //Transforma a data passada por parametro em uma string
        List<String> lista = new ArrayList<String>();
        Date datas = data;
        Integer ano, mes, dia;
        ano = datas.getYear() + 1900;
        mes = datas.getMonth() + 1;
        dia = datas.getDate();
        lista.add(ano.toString());
        if (mes < 10) {
            lista.add("0" + mes.toString());
        } 
        else {
            lista.add(mes.toString());
        }
        if (dia < 10) {
            lista.add("0" + dia.toString());
        } 
        
        else {
            lista.add(dia.toString());
        }
        String resultado = lista.get(0) + lista.get(1) + lista.get(2);
        return resultado;
    }
    
}
